package com.cskaoyan.javase.oop2.encapsulate._1extends._7initialization._4super;

/**
 * super vs this
 * 它们两非常相似
 * 在能够使用this的地方,都是可以用super的,也就是非静态的上下文
 * 包括:
 *      1.成员方法
 *      2.构造器
 *      3.构造代码块
 * 但是在构造器中,它们有特殊的用途,表示调用其他构造器
 * 成员方法和构造代码块中,它们只能表示访问成员
 *
 * 区别:
 *      1.(最主要,核心)
 *      this是一个引用,它就指向子类自身对象,当前对象
 *      super指向的不是一个对象,而是子类对象中属于父类的那片区域
 *          所以super不是一个引用
 *
 *      2.使用时的区别
 *          大多数情况下情况,把this当成指向子类对象去使用,把super当成指向父类对象去使用 是没有问题的
 *          但是要注意访问权限的问题
 *          this终究是在子类自身中使用,自己访问自己,不受权限限制
 *          但super终究是子类中访问父类,受权限限制
 *
 * this指向的是整个子类对象,但super只是表示子类对象中父类成员的区域
 * 所以this实际上是包含super的
 * 如果父类有一个num,而子类没有这个num,那么this和super可以访问父类的同一个num
 * 只有当父子类同时存在同名num时,this.访问的是子类自身的num,super.访问的是父类的num
 *
 * @since 11:48
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Son().test(999);
    }
}

class Father {
    private int num;
    int num2 = 777;
}

class Son extends Father {

    int num2 = 888;

    public void test(int num2) {
        System.out.println(this);
        // super不是引用,不能输出
        // System.out.println(super);
        // System.out.println(super.num);
        System.out.println(super.num2);
        System.out.println(this.num2);
        System.out.println(num2);
    }
}